package kevin.framework.basic.common.xls;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.multipart.MultipartHttpServletRequest;

/**
 * @ClassName: XlsOperationInterface
 * @Description: 定义xls操作接口，定义实体ben转数组，数组转实体bean操作，此类接口供controller实现，实现这些接口的controller即基本基本的xls导出、导入功能
 * @author kevin.huang
 * @date 2015-1-21 上午10:38:54
 */
public interface IXlsOperator<T> {

	/****************************
	 * 以下为导入接口定义
	 *****************************************/
	/**
	 * @Title:导入时，获取导入sheet名称 @Description: TODO @param params 参数 @return @throws
	 */
	public abstract String getImportSheetName(MultipartHttpServletRequest request) throws Exception;

	/**
	 * @Title:导入时，获取sheet中数据开始的行号 @param params 参数 @return @throws
	 */
	public abstract int getImportStartRow(MultipartHttpServletRequest request) throws Exception;

	/**
	 * @Title: xlsInput 导入时候，将行数组数据转为实体数据 @Description: TODO @param rowData
	 * 对应xls行数据 @param reqParams 请求参数 @param extDataMap 其他数据 @return
	 * XlsConvertResult<T> @throws
	 */
	public abstract XlsConvertResult<T> xlsImport(String[] rowData, Map<String, String[]> reqParams,
			Map<Object, Object> extDataMap) throws Exception;

	/****************************
	 * 以下为导出接口定义
	 *****************************************/

	/**
	 * @Title: 导出时候，设置sheet名称 @Description: TODO @param request @return @throws
	 */
	public abstract String setExportSheetName(HttpServletRequest request) throws Exception;

	/**
	 * @Title: 设置导出xls时，列的标题，可以设置多标题(多行，跨行，跨列) @Description: TODO @param
	 * request @return @throws
	 */
	public abstract List<CustomCell[]> setExportSheetTitle(HttpServletRequest request) throws Exception;

	/**
	 * @Title: 导出时候设置xls的文件名称 @Description: TODO @param request @return @throws
	 */
	public abstract String setExportXlsFileName(HttpServletRequest request) throws Exception;

	/**
	 * @Title: xlsOutput 导出时候，将实体bean装为xld的单元格数据 @Description: TODO @param bean
	 * 导出到xls的实体bean @return @throws
	 */
	public abstract XlsCellData[] xlsExport(T bean, int row) throws Exception;

	/***
	 * 创建xls标题单元格的样式,需要自定义的样式请重写实现，不然默认返回null并采用默认的样式
	 ***/
	public abstract CustomCellStyle createHeaderCellStyle(String title, int rowIndex) throws Exception;

	/***
	 * 创建xls单元格的样式，需要自定义的样式请重写实现，不然默认返回null并采用默认的样式
	 ***/
	public abstract CustomCellStyle createBodyCellStyle(T bean, XlsCellData cellData, String colTitle) throws Exception;

	/**
	 * @Title: onSheetCreateCompleted
	 * 当一个sheet创建完成后，用于返回最后总结行，返回null则没有总结行 @Description: TODO @param dataArr 数据
	 * 如果是数字列则为sum后的数据，字符型则为空 @param row 数据行总行数 @return @throws
	 */
	public abstract XlsCellData[] onSheetCreateCompleted(Object[] dataArr, int rowCount, int rowNum) throws Exception;

}
